home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / scsi / scsi_transport_fc.h < prev    next >
Encoding:
C/C++ Source or Header  |  2008-12-24  |  23.9 KB  |  763 lines

  1. /*
  2.  *  FiberChannel transport specific attributes exported to sysfs.
  3.  *
  4.  *  Copyright (c) 2003 Silicon Graphics, Inc.  All rights reserved.
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2 of the License, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  19.  *
  20.  *  ========
  21.  *
  22.  *  Copyright (C) 2004-2007   James Smart, Emulex Corporation
  23.  *    Rewrite for host, target, device, and remote port attributes,
  24.  *    statistics, and service functions...
  25.  *
  26.  */
  27. #ifndef SCSI_TRANSPORT_FC_H
  28. #define SCSI_TRANSPORT_FC_H
  29.  
  30. #include <linux/sched.h>
  31. #include <scsi/scsi.h>
  32. #include <scsi/scsi_netlink.h>
  33.  
  34. struct scsi_transport_template;
  35.  
  36.  
  37. /*
  38.  * FC Port definitions - Following FC HBAAPI guidelines
  39.  *
  40.  * Note: Not all binary values for the different fields match HBAAPI.
  41.  *  Instead, we use densely packed ordinal values or enums.
  42.  *  We get away with this as we never present the actual binary values
  43.  *  externally. For sysfs, we always present the string that describes
  44.  *  the value. Thus, an admin doesn't need a magic HBAAPI decoder ring
  45.  *  to understand the values. The HBAAPI user-space library is free to
  46.  *  convert the strings into the HBAAPI-specified binary values.
  47.  *
  48.  * Note: Not all HBAAPI-defined values are contained in the definitions
  49.  *  below. Those not appropriate to an fc_host (e.g. FCP initiator) have
  50.  *  been removed.
  51.  */
  52.  
  53. /*
  54.  * fc_port_type: If you alter this, you also need to alter scsi_transport_fc.c
  55.  * (for the ascii descriptions).
  56.  */
  57. enum fc_port_type {
  58.     FC_PORTTYPE_UNKNOWN,
  59.     FC_PORTTYPE_OTHER,
  60.     FC_PORTTYPE_NOTPRESENT,
  61.     FC_PORTTYPE_NPORT,        /* Attached to FPort */
  62.     FC_PORTTYPE_NLPORT,        /* (Public) Loop w/ FLPort */
  63.     FC_PORTTYPE_LPORT,        /* (Private) Loop w/o FLPort */
  64.     FC_PORTTYPE_PTP,        /* Point to Point w/ another NPort */
  65.     FC_PORTTYPE_NPIV,        /* VPORT based on NPIV */
  66. };
  67.  
  68.  
  69. /*
  70.  * fc_port_state: If you alter this, you also need to alter scsi_transport_fc.c
  71.  * (for the ascii descriptions).
  72.  */
  73. enum fc_port_state {
  74.     FC_PORTSTATE_UNKNOWN,
  75.     FC_PORTSTATE_NOTPRESENT,
  76.     FC_PORTSTATE_ONLINE,
  77.     FC_PORTSTATE_OFFLINE,        /* User has taken Port Offline */
  78.     FC_PORTSTATE_BLOCKED,
  79.     FC_PORTSTATE_BYPASSED,
  80.     FC_PORTSTATE_DIAGNOSTICS,
  81.     FC_PORTSTATE_LINKDOWN,
  82.     FC_PORTSTATE_ERROR,
  83.     FC_PORTSTATE_LOOPBACK,
  84.     FC_PORTSTATE_DELETED,
  85. };
  86.  
  87.  
  88. /*
  89.  * fc_vport_state: If you alter this, you also need to alter
  90.  * scsi_transport_fc.c (for the ascii descriptions).
  91.  */
  92. enum fc_vport_state {
  93.     FC_VPORT_UNKNOWN,
  94.     FC_VPORT_ACTIVE,
  95.     FC_VPORT_DISABLED,
  96.     FC_VPORT_LINKDOWN,
  97.     FC_VPORT_INITIALIZING,
  98.     FC_VPORT_NO_FABRIC_SUPP,
  99.     FC_VPORT_NO_FABRIC_RSCS,
  100.     FC_VPORT_FABRIC_LOGOUT,
  101.     FC_VPORT_FABRIC_REJ_WWN,
  102.     FC_VPORT_FAILED,
  103. };
  104.  
  105.  
  106.  
  107. /*
  108.  * FC Classes of Service
  109.  * Note: values are not enumerated, as they can be "or'd" together
  110.  * for reporting (e.g. report supported_classes). If you alter this list,
  111.  * you also need to alter scsi_transport_fc.c (for the ascii descriptions).
  112.  */
  113. #define FC_COS_UNSPECIFIED        0
  114. #define FC_COS_CLASS1            2
  115. #define FC_COS_CLASS2            4
  116. #define FC_COS_CLASS3            8
  117. #define FC_COS_CLASS4            0x10
  118. #define FC_COS_CLASS6            0x40
  119.  
  120. /*
  121.  * FC Port Speeds
  122.  * Note: values are not enumerated, as they can be "or'd" together
  123.  * for reporting (e.g. report supported_speeds). If you alter this list,
  124.  * you also need to alter scsi_transport_fc.c (for the ascii descriptions).
  125.  */
  126. #define FC_PORTSPEED_UNKNOWN        0 /* Unknown - transceiver
  127.                          incapable of reporting */
  128. #define FC_PORTSPEED_1GBIT        1
  129. #define FC_PORTSPEED_2GBIT        2
  130. #define FC_PORTSPEED_4GBIT        4
  131. #define FC_PORTSPEED_10GBIT        8
  132. #define FC_PORTSPEED_8GBIT        0x10
  133. #define FC_PORTSPEED_16GBIT        0x20
  134. #define FC_PORTSPEED_NOT_NEGOTIATED    (1 << 15) /* Speed not established */
  135.  
  136. /*
  137.  * fc_tgtid_binding_type: If you alter this, you also need to alter
  138.  * scsi_transport_fc.c (for the ascii descriptions).
  139.  */
  140. enum fc_tgtid_binding_type  {
  141.     FC_TGTID_BIND_NONE,
  142.     FC_TGTID_BIND_BY_WWPN,
  143.     FC_TGTID_BIND_BY_WWNN,
  144.     FC_TGTID_BIND_BY_ID,
  145. };
  146.  
  147. /*
  148.  * FC Port Roles
  149.  * Note: values are not enumerated, as they can be "or'd" together
  150.  * for reporting (e.g. report roles). If you alter this list,
  151.  * you also need to alter scsi_transport_fc.c (for the ascii descriptions).
  152.  */
  153. #define FC_PORT_ROLE_UNKNOWN            0x00
  154. #define FC_PORT_ROLE_FCP_TARGET            0x01
  155. #define FC_PORT_ROLE_FCP_INITIATOR        0x02
  156. #define FC_PORT_ROLE_IP_PORT            0x04
  157.  
  158. /* The following are for compatibility */
  159. #define FC_RPORT_ROLE_UNKNOWN            FC_PORT_ROLE_UNKNOWN
  160. #define FC_RPORT_ROLE_FCP_TARGET        FC_PORT_ROLE_FCP_TARGET
  161. #define FC_RPORT_ROLE_FCP_INITIATOR        FC_PORT_ROLE_FCP_INITIATOR
  162. #define FC_RPORT_ROLE_IP_PORT            FC_PORT_ROLE_IP_PORT
  163.  
  164.  
  165. /* Macro for use in defining Virtual Port attributes */
  166. #define FC_VPORT_ATTR(_name,_mode,_show,_store)        \
  167. struct device_attribute dev_attr_vport_##_name =     \
  168.     __ATTR(_name,_mode,_show,_store)
  169.  
  170. /*
  171.  * fc_vport_identifiers: This set of data contains all elements
  172.  * to uniquely identify and instantiate a FC virtual port.
  173.  *
  174.  * Notes:
  175.  *   symbolic_name: The driver is to append the symbolic_name string data
  176.  *      to the symbolic_node_name data that it generates by default.
  177.  *      the resulting combination should then be registered with the switch.
  178.  *      It is expected that things like Xen may stuff a VM title into
  179.  *      this field.
  180.  */
  181. #define FC_VPORT_SYMBOLIC_NAMELEN        64
  182. struct fc_vport_identifiers {
  183.     u64 node_name;
  184.     u64 port_name;
  185.     u32 roles;
  186.     bool disable;
  187.     enum fc_port_type vport_type;    /* only FC_PORTTYPE_NPIV allowed */
  188.     char symbolic_name[FC_VPORT_SYMBOLIC_NAMELEN];
  189. };
  190.  
  191. /*
  192.  * FC Virtual Port Attributes
  193.  *
  194.  * This structure exists for each FC port is a virtual FC port. Virtual
  195.  * ports share the physical link with the Physical port. Each virtual
  196.  * ports has a unique presense on the SAN, and may be instantiated via
  197.  * NPIV, Virtual Fabrics, or via additional ALPAs. As the vport is a
  198.  * unique presense, each vport has it's own view of the fabric,
  199.  * authentication privilege, and priorities.
  200.  *
  201.  * A virtual port may support 1 or more FC4 roles. Typically it is a
  202.  * FCP Initiator. It could be a FCP Target, or exist sole for an IP over FC
  203.  * roles. FC port attributes for the vport will be reported on any
  204.  * fc_host class object allocated for an FCP Initiator.
  205.  *
  206.  * --
  207.  *
  208.  * Fixed attributes are not expected to change. The driver is
  209.  * expected to set these values after receiving the fc_vport structure
  210.  * via the vport_create() call from the transport.
  211.  * The transport fully manages all get functions w/o driver interaction.
  212.  *
  213.  * Dynamic attributes are expected to change. The driver participates
  214.  * in all get/set operations via functions provided by the driver.
  215.  *
  216.  * Private attributes are transport-managed values. They are fully
  217.  * managed by the transport w/o driver interaction.
  218.  */
  219.  
  220. struct fc_vport {
  221.     /* Fixed Attributes */
  222.  
  223.     /* Dynamic Attributes */
  224.  
  225.     /* Private (Transport-managed) Attributes */
  226.     enum fc_vport_state vport_state;
  227.     enum fc_vport_state vport_last_state;
  228.     u64 node_name;
  229.     u64 port_name;
  230.     u32 roles;
  231.     u32 vport_id;        /* Admin Identifier for the vport */
  232.     enum fc_port_type vport_type;
  233.     char symbolic_name[FC_VPORT_SYMBOLIC_NAMELEN];
  234.  
  235.     /* exported data */
  236.     void *dd_data;            /* Used for driver-specific storage */
  237.  
  238.     /* internal data */
  239.     struct Scsi_Host *shost;    /* Physical Port Parent */
  240.     unsigned int channel;
  241.     u32 number;
  242.     u8 flags;
  243.     struct list_head peers;
  244.     struct device dev;
  245.     struct work_struct vport_delete_work;
  246. } __attribute__((aligned(sizeof(unsigned long))));
  247.  
  248. /* bit field values for struct fc_vport "flags" field: */
  249. #define FC_VPORT_CREATING        0x01
  250. #define FC_VPORT_DELETING        0x02
  251. #define FC_VPORT_DELETED        0x04
  252. #define FC_VPORT_DEL            0x06    /* Any DELETE state */
  253.  
  254. #define    dev_to_vport(d)                \
  255.     container_of(d, struct fc_vport, dev)
  256. #define transport_class_to_vport(dev)        \
  257.     dev_to_vport(dev->parent)
  258. #define vport_to_shost(v)            \
  259.     (v->shost)
  260. #define vport_to_shost_channel(v)        \
  261.     (v->channel)
  262. #define vport_to_parent(v)            \
  263.     (v->dev.parent)
  264.  
  265.  
  266. /* Error return codes for vport_create() callback */
  267. #define VPCERR_UNSUPPORTED        -ENOSYS        /* no driver/adapter
  268.                                support */
  269. #define VPCERR_BAD_WWN            -ENOTUNIQ    /* driver validation
  270.                                of WWNs failed */
  271. #define VPCERR_NO_FABRIC_SUPP        -EOPNOTSUPP    /* Fabric connection
  272.                                is loop or the
  273.                                Fabric Port does
  274.                                not support NPIV */
  275.  
  276. /*
  277.  * fc_rport_identifiers: This set of data contains all elements
  278.  * to uniquely identify a remote FC port. The driver uses this data
  279.  * to report the existence of a remote FC port in the topology. Internally,
  280.  * the transport uses this data for attributes and to manage consistent
  281.  * target id bindings.
  282.  */
  283. struct fc_rport_identifiers {
  284.     u64 node_name;
  285.     u64 port_name;
  286.     u32 port_id;
  287.     u32 roles;
  288. };
  289.  
  290.  
  291. /* Macro for use in defining Remote Port attributes */
  292. #define FC_RPORT_ATTR(_name,_mode,_show,_store)                \
  293. struct device_attribute dev_attr_rport_##_name =     \
  294.     __ATTR(_name,_mode,_show,_store)
  295.  
  296.  
  297. /*
  298.  * FC Remote Port Attributes
  299.  *
  300.  * This structure exists for each remote FC port that a LLDD notifies
  301.  * the subsystem of.  A remote FC port may or may not be a SCSI Target,
  302.  * also be a SCSI initiator, IP endpoint, etc. As such, the remote
  303.  * port is considered a separate entity, independent of "role" (such
  304.  * as scsi target).
  305.  *
  306.  * --
  307.  *
  308.  * Attributes are based on HBAAPI V2.0 definitions. Only those
  309.  * attributes that are determinable by the local port (aka Host)
  310.  * are contained.
  311.  *
  312.  * Fixed attributes are not expected to change. The driver is
  313.  * expected to set these values after successfully calling
  314.  * fc_remote_port_add(). The transport fully manages all get functions
  315.  * w/o driver interaction.
  316.  *
  317.  * Dynamic attributes are expected to change. The driver participates
  318.  * in all get/set operations via functions provided by the driver.
  319.  *
  320.  * Private attributes are transport-managed values. They are fully
  321.  * managed by the transport w/o driver interaction.
  322.  */
  323.  
  324. struct fc_rport {    /* aka fc_starget_attrs */
  325.     /* Fixed Attributes */
  326.     u32 maxframe_size;
  327.     u32 supported_classes;
  328.  
  329.     /* Dynamic Attributes */
  330.     u32 dev_loss_tmo;    /* Remote Port loss timeout in seconds. */
  331.  
  332.     /* Private (Transport-managed) Attributes */
  333.     u64 node_name;
  334.     u64 port_name;
  335.     u32 port_id;
  336.     u32 roles;
  337.     enum fc_port_state port_state;    /* Will only be ONLINE or UNKNOWN */
  338.     u32 scsi_target_id;
  339.     u32 fast_io_fail_tmo;
  340.  
  341.     /* exported data */
  342.     void *dd_data;            /* Used for driver-specific storage */
  343.  
  344.     /* internal data */
  345.     unsigned int channel;
  346.     u32 number;
  347.     u8 flags;
  348.     struct list_head peers;
  349.     struct device dev;
  350.      struct delayed_work dev_loss_work;
  351.      struct work_struct scan_work;
  352.      struct delayed_work fail_io_work;
  353.      struct work_struct stgt_delete_work;
  354.     struct work_struct rport_delete_work;
  355. } __attribute__((aligned(sizeof(unsigned long))));
  356.  
  357. /* bit field values for struct fc_rport "flags" field: */
  358. #define FC_RPORT_DEVLOSS_PENDING    0x01
  359. #define FC_RPORT_SCAN_PENDING        0x02
  360. #define FC_RPORT_FAST_FAIL_TIMEDOUT    0x04
  361.  
  362. #define    dev_to_rport(d)                \
  363.     container_of(d, struct fc_rport, dev)
  364. #define transport_class_to_rport(dev)    \
  365.     dev_to_rport(dev->parent)
  366. #define rport_to_shost(r)            \
  367.     dev_to_shost(r->dev.parent)
  368.  
  369. /*
  370.  * FC SCSI Target Attributes
  371.  *
  372.  * The SCSI Target is considered an extention of a remote port (as
  373.  * a remote port can be more than a SCSI Target). Within the scsi
  374.  * subsystem, we leave the Target as a separate entity. Doing so
  375.  * provides backward compatibility with prior FC transport api's,
  376.  * and lets remote ports be handled entirely within the FC transport
  377.  * and independently from the scsi subsystem. The drawback is that
  378.  * some data will be duplicated.
  379.  */
  380.  
  381. struct fc_starget_attrs {    /* aka fc_target_attrs */
  382.     /* Dynamic Attributes */
  383.     u64 node_name;
  384.     u64 port_name;
  385.     u32 port_id;
  386. };
  387.  
  388. #define fc_starget_node_name(x) \
  389.     (((struct fc_starget_attrs *)&(x)->starget_data)->node_name)
  390. #define fc_starget_port_name(x)    \
  391.     (((struct fc_starget_attrs *)&(x)->starget_data)->port_name)
  392. #define fc_starget_port_id(x) \
  393.     (((struct fc_starget_attrs *)&(x)->starget_data)->port_id)
  394.  
  395. #define starget_to_rport(s)            \
  396.     scsi_is_fc_rport(s->dev.parent) ? dev_to_rport(s->dev.parent) : NULL
  397.  
  398.  
  399. /*
  400.  * FC Local Port (Host) Statistics
  401.  */
  402.  
  403. /* FC Statistics - Following FC HBAAPI v2.0 guidelines */
  404. struct fc_host_statistics {
  405.     /* port statistics */
  406.     u64 seconds_since_last_reset;
  407.     u64 tx_frames;
  408.     u64 tx_words;
  409.     u64 rx_frames;
  410.     u64 rx_words;
  411.     u64 lip_count;
  412.     u64 nos_count;
  413.     u64 error_frames;
  414.     u64 dumped_frames;
  415.     u64 link_failure_count;
  416.     u64 loss_of_sync_count;
  417.     u64 loss_of_signal_count;
  418.     u64 prim_seq_protocol_err_count;
  419.     u64 invalid_tx_word_count;
  420.     u64 invalid_crc_count;
  421.  
  422.     /* fc4 statistics  (only FCP supported currently) */
  423.     u64 fcp_input_requests;
  424.     u64 fcp_output_requests;
  425.     u64 fcp_control_requests;
  426.     u64 fcp_input_megabytes;
  427.     u64 fcp_output_megabytes;
  428. };
  429.  
  430.  
  431. /*
  432.  * FC Event Codes - Polled and Async, following FC HBAAPI v2.0 guidelines
  433.  */
  434.  
  435. /*
  436.  * fc_host_event_code: If you alter this, you also need to alter
  437.  * scsi_transport_fc.c (for the ascii descriptions).
  438.  */
  439. enum fc_host_event_code  {
  440.     FCH_EVT_LIP            = 0x1,
  441.     FCH_EVT_LINKUP            = 0x2,
  442.     FCH_EVT_LINKDOWN        = 0x3,
  443.     FCH_EVT_LIPRESET        = 0x4,
  444.     FCH_EVT_RSCN            = 0x5,
  445.     FCH_EVT_ADAPTER_CHANGE        = 0x103,
  446.     FCH_EVT_PORT_UNKNOWN        = 0x200,
  447.     FCH_EVT_PORT_OFFLINE        = 0x201,
  448.     FCH_EVT_PORT_ONLINE        = 0x202,
  449.     FCH_EVT_PORT_FABRIC        = 0x204,
  450.     FCH_EVT_LINK_UNKNOWN        = 0x500,
  451.     FCH_EVT_VENDOR_UNIQUE        = 0xffff,
  452. };
  453.  
  454.  
  455. /*
  456.  * FC Local Port (Host) Attributes
  457.  *
  458.  * Attributes are based on HBAAPI V2.0 definitions.
  459.  * Note: OSDeviceName is determined by user-space library
  460.  *
  461.  * Fixed attributes are not expected to change. The driver is
  462.  * expected to set these values after successfully calling scsi_add_host().
  463.  * The transport fully manages all get functions w/o driver interaction.
  464.  *
  465.  * Dynamic attributes are expected to change. The driver participates
  466.  * in all get/set operations via functions provided by the driver.
  467.  *
  468.  * Private attributes are transport-managed values. They are fully
  469.  * managed by the transport w/o driver interaction.
  470.  */
  471.  
  472. #define FC_FC4_LIST_SIZE        32
  473. #define FC_SYMBOLIC_NAME_SIZE        256
  474. #define FC_VERSION_STRING_SIZE        64
  475. #define FC_SERIAL_NUMBER_SIZE        80
  476.  
  477. struct fc_host_attrs {
  478.     /* Fixed Attributes */
  479.     u64 node_name;
  480.     u64 port_name;
  481.     u64 permanent_port_name;
  482.     u32 supported_classes;
  483.     u8  supported_fc4s[FC_FC4_LIST_SIZE];
  484.     u32 supported_speeds;
  485.     u32 maxframe_size;
  486.     u16 max_npiv_vports;
  487.     char serial_number[FC_SERIAL_NUMBER_SIZE];
  488.  
  489.     /* Dynamic Attributes */
  490.     u32 port_id;
  491.     enum fc_port_type port_type;
  492.     enum fc_port_state port_state;
  493.     u8  active_fc4s[FC_FC4_LIST_SIZE];
  494.     u32 speed;
  495.     u64 fabric_name;
  496.     char symbolic_name[FC_SYMBOLIC_NAME_SIZE];
  497.     char system_hostname[FC_SYMBOLIC_NAME_SIZE];
  498.  
  499.     /* Private (Transport-managed) Attributes */
  500.     enum fc_tgtid_binding_type  tgtid_bind_type;
  501.  
  502.     /* internal data */
  503.     struct list_head rports;
  504.     struct list_head rport_bindings;
  505.     struct list_head vports;
  506.     u32 next_rport_number;
  507.     u32 next_target_id;
  508.     u32 next_vport_number;
  509.     u16 npiv_vports_inuse;
  510.  
  511.     /* work queues for rport state manipulation */
  512.     char work_q_name[20];
  513.     struct workqueue_struct *work_q;
  514.     char devloss_work_q_name[20];
  515.     struct workqueue_struct *devloss_work_q;
  516. };
  517.  
  518. #define shost_to_fc_host(x) \
  519.     ((struct fc_host_attrs *)(x)->shost_data)
  520.  
  521. #define fc_host_node_name(x) \
  522.     (((struct fc_host_attrs *)(x)->shost_data)->node_name)
  523. #define fc_host_port_name(x)    \
  524.     (((struct fc_host_attrs *)(x)->shost_data)->port_name)
  525. #define fc_host_permanent_port_name(x)    \
  526.     (((struct fc_host_attrs *)(x)->shost_data)->permanent_port_name)
  527. #define fc_host_supported_classes(x)    \
  528.     (((struct fc_host_attrs *)(x)->shost_data)->supported_classes)
  529. #define fc_host_supported_fc4s(x)    \
  530.     (((struct fc_host_attrs *)(x)->shost_data)->supported_fc4s)
  531. #define fc_host_supported_speeds(x)    \
  532.     (((struct fc_host_attrs *)(x)->shost_data)->supported_speeds)
  533. #define fc_host_maxframe_size(x)    \
  534.     (((struct fc_host_attrs *)(x)->shost_data)->maxframe_size)
  535. #define fc_host_max_npiv_vports(x)    \
  536.     (((struct fc_host_attrs *)(x)->shost_data)->max_npiv_vports)
  537. #define fc_host_serial_number(x)    \
  538.     (((struct fc_host_attrs *)(x)->shost_data)->serial_number)
  539. #define fc_host_port_id(x)    \
  540.     (((struct fc_host_attrs *)(x)->shost_data)->port_id)
  541. #define fc_host_port_type(x)    \
  542.     (((struct fc_host_attrs *)(x)->shost_data)->port_type)
  543. #define fc_host_port_state(x)    \
  544.     (((struct fc_host_attrs *)(x)->shost_data)->port_state)
  545. #define fc_host_active_fc4s(x)    \
  546.     (((struct fc_host_attrs *)(x)->shost_data)->active_fc4s)
  547. #define fc_host_speed(x)    \
  548.     (((struct fc_host_attrs *)(x)->shost_data)->speed)
  549. #define fc_host_fabric_name(x)    \
  550.     (((struct fc_host_attrs *)(x)->shost_data)->fabric_name)
  551. #define fc_host_symbolic_name(x)    \
  552.     (((struct fc_host_attrs *)(x)->shost_data)->symbolic_name)
  553. #define fc_host_system_hostname(x)    \
  554.     (((struct fc_host_attrs *)(x)->shost_data)->system_hostname)
  555. #define fc_host_tgtid_bind_type(x) \
  556.     (((struct fc_host_attrs *)(x)->shost_data)->tgtid_bind_type)
  557. #define fc_host_rports(x) \
  558.     (((struct fc_host_attrs *)(x)->shost_data)->rports)
  559. #define fc_host_rport_bindings(x) \
  560.     (((struct fc_host_attrs *)(x)->shost_data)->rport_bindings)
  561. #define fc_host_vports(x) \
  562.     (((struct fc_host_attrs *)(x)->shost_data)->vports)
  563. #define fc_host_next_rport_number(x) \
  564.     (((struct fc_host_attrs *)(x)->shost_data)->next_rport_number)
  565. #define fc_host_next_target_id(x) \
  566.     (((struct fc_host_attrs *)(x)->shost_data)->next_target_id)
  567. #define fc_host_next_vport_number(x) \
  568.     (((struct fc_host_attrs *)(x)->shost_data)->next_vport_number)
  569. #define fc_host_npiv_vports_inuse(x)    \
  570.     (((struct fc_host_attrs *)(x)->shost_data)->npiv_vports_inuse)
  571. #define fc_host_work_q_name(x) \
  572.     (((struct fc_host_attrs *)(x)->shost_data)->work_q_name)
  573. #define fc_host_work_q(x) \
  574.     (((struct fc_host_attrs *)(x)->shost_data)->work_q)
  575. #define fc_host_devloss_work_q_name(x) \
  576.     (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q_name)
  577. #define fc_host_devloss_work_q(x) \
  578.     (((struct fc_host_attrs *)(x)->shost_data)->devloss_work_q)
  579.  
  580.  
  581. /* The functions by which the transport class and the driver communicate */
  582. struct fc_function_template {
  583.     void    (*get_rport_dev_loss_tmo)(struct fc_rport *);
  584.     void    (*set_rport_dev_loss_tmo)(struct fc_rport *, u32);
  585.  
  586.     void    (*get_starget_node_name)(struct scsi_target *);
  587.     void    (*get_starget_port_name)(struct scsi_target *);
  588.     void     (*get_starget_port_id)(struct scsi_target *);
  589.  
  590.     void     (*get_host_port_id)(struct Scsi_Host *);
  591.     void    (*get_host_port_type)(struct Scsi_Host *);
  592.     void    (*get_host_port_state)(struct Scsi_Host *);
  593.     void    (*get_host_active_fc4s)(struct Scsi_Host *);
  594.     void    (*get_host_speed)(struct Scsi_Host *);
  595.     void    (*get_host_fabric_name)(struct Scsi_Host *);
  596.     void    (*get_host_symbolic_name)(struct Scsi_Host *);
  597.     void    (*set_host_system_hostname)(struct Scsi_Host *);
  598.  
  599.     struct fc_host_statistics * (*get_fc_host_stats)(struct Scsi_Host *);
  600.     void    (*reset_fc_host_stats)(struct Scsi_Host *);
  601.  
  602.     int    (*issue_fc_host_lip)(struct Scsi_Host *);
  603.  
  604.     void    (*dev_loss_tmo_callbk)(struct fc_rport *);
  605.     void    (*terminate_rport_io)(struct fc_rport *);
  606.  
  607.     void    (*set_vport_symbolic_name)(struct fc_vport *);
  608.     int      (*vport_create)(struct fc_vport *, bool);
  609.     int    (*vport_disable)(struct fc_vport *, bool);
  610.     int      (*vport_delete)(struct fc_vport *);
  611.  
  612.     /* target-mode drivers' functions */
  613.     int     (* tsk_mgmt_response)(struct Scsi_Host *, u64, u64, int);
  614.     int     (* it_nexus_response)(struct Scsi_Host *, u64, int);
  615.  
  616.     /* allocation lengths for host-specific data */
  617.     u32                 dd_fcrport_size;
  618.     u32                 dd_fcvport_size;
  619.  
  620.     /*
  621.      * The driver sets these to tell the transport class it
  622.      * wants the attributes displayed in sysfs.  If the show_ flag
  623.      * is not set, the attribute will be private to the transport
  624.      * class
  625.      */
  626.  
  627.     /* remote port fixed attributes */
  628.     unsigned long    show_rport_maxframe_size:1;
  629.     unsigned long    show_rport_supported_classes:1;
  630.     unsigned long   show_rport_dev_loss_tmo:1;
  631.  
  632.     /*
  633.      * target dynamic attributes
  634.      * These should all be "1" if the driver uses the remote port
  635.      * add/delete functions (so attributes reflect rport values).
  636.      */
  637.     unsigned long    show_starget_node_name:1;
  638.     unsigned long    show_starget_port_name:1;
  639.     unsigned long    show_starget_port_id:1;
  640.  
  641.     /* host fixed attributes */
  642.     unsigned long    show_host_node_name:1;
  643.     unsigned long    show_host_port_name:1;
  644.     unsigned long    show_host_permanent_port_name:1;
  645.     unsigned long    show_host_supported_classes:1;
  646.     unsigned long    show_host_supported_fc4s:1;
  647.     unsigned long    show_host_supported_speeds:1;
  648.     unsigned long    show_host_maxframe_size:1;
  649.     unsigned long    show_host_serial_number:1;
  650.     /* host dynamic attributes */
  651.     unsigned long    show_host_port_id:1;
  652.     unsigned long    show_host_port_type:1;
  653.     unsigned long    show_host_port_state:1;
  654.     unsigned long    show_host_active_fc4s:1;
  655.     unsigned long    show_host_speed:1;
  656.     unsigned long    show_host_fabric_name:1;
  657.     unsigned long    show_host_symbolic_name:1;
  658.     unsigned long    show_host_system_hostname:1;
  659.  
  660.     unsigned long    disable_target_scan:1;
  661. };
  662.  
  663.  
  664. /**
  665.  * fc_remote_port_chkready - called to validate the remote port state
  666.  *   prior to initiating io to the port.
  667.  *
  668.  * Returns a scsi result code that can be returned by the LLDD.
  669.  *
  670.  * @rport:    remote port to be checked
  671.  **/
  672. static inline int
  673. fc_remote_port_chkready(struct fc_rport *rport)
  674. {
  675.     int result;
  676.  
  677.     switch (rport->port_state) {
  678.     case FC_PORTSTATE_ONLINE:
  679.         if (rport->roles & FC_PORT_ROLE_FCP_TARGET)
  680.             result = 0;
  681.         else if (rport->flags & FC_RPORT_DEVLOSS_PENDING)
  682.             result = DID_TRANSPORT_DISRUPTED << 16;
  683.         else
  684.             result = DID_NO_CONNECT << 16;
  685.         break;
  686.     case FC_PORTSTATE_BLOCKED:
  687.         if (rport->flags & FC_RPORT_FAST_FAIL_TIMEDOUT)
  688.             result = DID_TRANSPORT_FAILFAST << 16;
  689.         else
  690.             result = DID_TRANSPORT_DISRUPTED << 16;
  691.         break;
  692.     default:
  693.         result = DID_NO_CONNECT << 16;
  694.         break;
  695.     }
  696.     return result;
  697. }
  698.  
  699. static inline u64 wwn_to_u64(u8 *wwn)
  700. {
  701.     return (u64)wwn[0] << 56 | (u64)wwn[1] << 48 |
  702.         (u64)wwn[2] << 40 | (u64)wwn[3] << 32 |
  703.         (u64)wwn[4] << 24 | (u64)wwn[5] << 16 |
  704.         (u64)wwn[6] <<  8 | (u64)wwn[7];
  705. }
  706.  
  707. static inline void u64_to_wwn(u64 inm, u8 *wwn)
  708. {
  709.     wwn[0] = (inm >> 56) & 0xff;
  710.     wwn[1] = (inm >> 48) & 0xff;
  711.     wwn[2] = (inm >> 40) & 0xff;
  712.     wwn[3] = (inm >> 32) & 0xff;
  713.     wwn[4] = (inm >> 24) & 0xff;
  714.     wwn[5] = (inm >> 16) & 0xff;
  715.     wwn[6] = (inm >> 8) & 0xff;
  716.     wwn[7] = inm & 0xff;
  717. }
  718.  
  719. /**
  720.  * fc_vport_set_state() - called to set a vport's state. Saves the old state,
  721.  *   excepting the transitory states of initializing and sending the ELS
  722.  *   traffic to instantiate the vport on the link.
  723.  *
  724.  * Assumes the driver has surrounded this with the proper locking to ensure
  725.  * a coherent state change.
  726.  *
  727.  * @vport:    virtual port whose state is changing
  728.  * @new_state:  new state
  729.  **/
  730. static inline void
  731. fc_vport_set_state(struct fc_vport *vport, enum fc_vport_state new_state)
  732. {
  733.     if ((new_state != FC_VPORT_UNKNOWN) &&
  734.         (new_state != FC_VPORT_INITIALIZING))
  735.         vport->vport_last_state = vport->vport_state;
  736.     vport->vport_state = new_state;
  737. }
  738.  
  739.  
  740. struct scsi_transport_template *fc_attach_transport(
  741.             struct fc_function_template *);
  742. void fc_release_transport(struct scsi_transport_template *);
  743. void fc_remove_host(struct Scsi_Host *);
  744. struct fc_rport *fc_remote_port_add(struct Scsi_Host *shost,
  745.             int channel, struct fc_rport_identifiers  *ids);
  746. void fc_remote_port_delete(struct fc_rport  *rport);
  747. void fc_remote_port_rolechg(struct fc_rport  *rport, u32 roles);
  748. int scsi_is_fc_rport(const struct device *);
  749. u32 fc_get_event_number(void);
  750. void fc_host_post_event(struct Scsi_Host *shost, u32 event_number,
  751.         enum fc_host_event_code event_code, u32 event_data);
  752. void fc_host_post_vendor_event(struct Scsi_Host *shost, u32 event_number,
  753.         u32 data_len, char * data_buf, u64 vendor_id);
  754.     /* Note: when specifying vendor_id to fc_host_post_vendor_event()
  755.      *   be sure to read the Vendor Type and ID formatting requirements
  756.      *   specified in scsi_netlink.h
  757.      */
  758. struct fc_vport *fc_vport_create(struct Scsi_Host *shost, int channel,
  759.         struct fc_vport_identifiers *);
  760. int fc_vport_terminate(struct fc_vport *vport);
  761.  
  762. #endif /* SCSI_TRANSPORT_FC_H */
  763.